package hn.cch.grammar.io;

import hn.cch.grammar.java.SystemDemo;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


public class FileDemo {





    /**
     * 获取包含的文件
     *
     * @param path 必须存在而且要是路径（否则返回空）
     * @return
     */
    public static List<String> listFile(File path) throws Exception {

        if (!path.exists()) {
            throw new Exception("config error : " + path.getPath() + "is not exists");
        }
        if (!path.isDirectory()) {
            throw new Exception("config error : " + path.getPath() + "is not directory");
        }

        File[] files = path.listFiles();
        List<String> nameList = new ArrayList<>();
        assert files != null;
        for (File file : files) {
            String name = file.getName();
            if (file.isFile()) {
                nameList.add(name);
            }
        }
        return nameList;
    }

    /**
     * 在有权限的路径上创建要操作的文件
     * 中间每层文件夹都配置777最大权限
     *
     * @param currentFile 要操作的文件
     * @param ownerFolder 有权限的路径
     * @return
     */
    public static void configurePermission(File currentFile, File ownerFolder) throws Exception {
        if (!ownerFolder.exists()) {
            throw new Exception("有权限的路径不存在");
        }

        if (!ownerFolder.getAbsolutePath().contains(currentFile.getAbsolutePath())) {
            throw new Exception("要操作的文件位于有权限的路径之外");
        }

        //此方法在Windows系统上会出现异常，Windows没有权限问题可以跳过
        if (SystemDemo.isWindows()) {
            throw new Exception("Windows系统跳过777权限配置");
        }
        // 777权限: 拥有者，所在组，其他人；读取，写入，执行
        Set<PosixFilePermission> permissions = new HashSet<>();
        permissions.add(PosixFilePermission.OWNER_READ); // 设置所有者的读取权限
        permissions.add(PosixFilePermission.OWNER_WRITE); // 设置所有者的写入权限
        permissions.add(PosixFilePermission.OWNER_EXECUTE);// 设置所有者的执行权限
        permissions.add(PosixFilePermission.GROUP_READ);// 设置组的读取权限
        permissions.add(PosixFilePermission.GROUP_WRITE);// 设置组的写入权限
        permissions.add(PosixFilePermission.GROUP_EXECUTE);// 设置组的执行权限
        permissions.add(PosixFilePermission.OTHERS_READ);// 设置其他的读取权限
        permissions.add(PosixFilePermission.OTHERS_WRITE);// 设置其他的写入权限
        permissions.add(PosixFilePermission.OTHERS_EXECUTE);// 设置其他的执行权限

        File parentFile = currentFile.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        //中间文件夹
        while (!ownerFolder.getAbsolutePath().equals(parentFile)) {
            try {
                Files.setPosixFilePermissions(Paths.get(parentFile.getAbsolutePath()), permissions);
            } catch (Exception e) {
                throw new Exception(e.getMessage());
            }
            parentFile = parentFile.getParentFile();
        }


    }


    /**
     * 设置权限
     *
     * @param file
     */
    public static void setPermission(File file) {
        file.setReadable(true, false);
        file.setWritable(true, false);
        file.setExecutable(true, false);
    }


    public static void main(String[] args) {

        test01();

    }

    public static void test01() {
        String dir = "src/main/resources/File";
        File file = new File(dir);
        File f1 = new File(dir, "f1.txt");
        boolean flag = false;
        try {
            if (!file.exists()) {
                flag = file.mkdirs();
                System.out.printf("mkdirs:%s\n", flag);

            }
            if (!f1.exists()) {

                flag = f1.createNewFile();
                System.out.printf("createNewFile:%s\n", flag);
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

}
